'''
__init__:初始化时魔术方法
__new__:实例化时的魔术方法,执行在__init__之前
__call__:将对象当成函数调用时，默认调用
__del__:调用结束，内存回收时调用
__str__:仅用对象名，返回更对信息
'''


class Person:
    def __init__(self, name):
        print('------>初始化')
        self.name = name

    def __new__(cls, *args, **kwargs):  # 新建对象空间，然后初始化
        print('----->new')
        return super().__new__(cls)  # 调用系统的__new__方法，只有return之后才会进行初始化

    def __call__(self, *args, **kwargs):  # 将对象换成函数
        print('---------call')
        print('---', *args)

    def __del__(self):  #
        print('------->del')

    def __str__(self):  # 仅用对象名，返回更对信息，一定有return
        return self.name


p = Person('张三')
print(p)  # 仅用对象名输出信息，默认调用__str__方法输出信息
p('李四')  # 对象当成函数使用，调用__call__魔术方法
# del p
